package gupao.concurrency.lock;

import gupao.concurrency.lock.utils.Utils;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

@Slf4j
public class DeadLock {


    static class SimpleDeadLockSyncSample {
//        static Object workLock = new Object();
//        static Object sleepLock = new Object();
//        public static void main(String[] args) throws InterruptedException {
//            Thread threadA = new Thread(() -> {
//                long start = System.currentTimeMillis();
//                while (true) {
//                    workAndSleep();
//                    Utils.sleepIgnoreExp(200);
//                    if((System.currentTimeMillis() - start) > 800){
//                        break;
//                    }
//                }
//            });
//
//            Thread threadB = new Thread(() -> {
//                long start = System.currentTimeMillis();
//                while (true) {
//                    sleepAndWork();
//                    Utils.sleepIgnoreExp(200);
//                    if((System.currentTimeMillis() - start) > 800){
//                        break;
//                    }
//                }
//            });
//
//            threadA.start();
//            threadB.start();
//            threadA.join();
//            threadB.join();
//        }
//
//        static List<Object> lockList = new ArrayList<>(2);
//
//        static boolean getWorkAndSleepSyncLock(){
//            synchronized (lockList){
//                if(lockList.contains(workLock) || lockList.contains(sleepLock)){
//                    //somebody has get the lock
//                    return false;
//                }
//                lockList.add(workLock);
//                lockList.add(sleepLock);
//                return true;
//            }
//        }
//
//        static void freeWorkAndSleepSyncLock(){
//            synchronized (lockList){
//                lockList.remove(workLock);
//                lockList.remove(sleepLock);
//            }
//        }
//
//        public static void workAndSleep() {
//            while (!getWorkAndSleepSyncLock()){
//                log.info("wait all lock are available");
//                Utils.sleepIgnoreExp(5);
//            }
//            log.info("Get all the locks");
//            try{
//                synchronized (workLock) {
//                    log.info("do some work");
//                    synchronized (sleepLock) {
//                        log.info("have some sleep");
//                    }
//                }
//            }finally {
//                freeWorkAndSleepSyncLock();
//            }
//        }
//
//        public static void sleepAndWork() {
//            while (!getWorkAndSleepSyncLock()){
//                log.info("wait all lock are available");
//                Utils.sleepIgnoreExp(5);
//            }
//            log.info("Get all the locks");
//            try{
//                synchronized (sleepLock) {
//                    log.info("have some sleep");
//                    synchronized (workLock) {
//                        log.info("do some work");
//                    }
//                }
//            }finally {
//                freeWorkAndSleepSyncLock();
//            }
//        }
    }
}
